﻿//private Boolean Adjust_Y_Position(double threshold, Int32 Y_pos_high_limit, Int32 Y_pos_low_limit, Int32 Y_Step, Int32 count)
//        {

//            for (int i = 0; i < count; i++)
//            {
//                Image<Bgr, Byte> current_image = GetImage(My_MotiCam, 0);
//                //imageBox1.Image = current_image;
//                //imageBox1.Refresh();
//                double avg_val = Get_Avg_Val(current_image, threshold);
//                //label_histogram.Text = "Average of gray image: " + avg_val.ToString();
//                //label_histogram.Refresh();

//                if (avg_val < Y_pos_low_limit)
//                {
//                    //label_current_Y_action.Text = "Adjusting in Y direction, attempt " + i.ToString() + " of " + count.ToString();
//                    //label_current_Y_action.Refresh();                    
//                    My_Stepper.MoveY(Y_Step);
//                    System.Threading.Thread.Sleep(2000);
//                }
//                else if (avg_val > Y_pos_high_limit)
//                {
//                    //label_current_Y_action.Text = "Adjusting in Y direction, attempt " + i.ToString() + " of " + count.ToString();
//                    //label_current_Y_action.Refresh(); 
//                    My_Stepper.MoveY(-Y_Step);
//                    System.Threading.Thread.Sleep(2000);
//                }
//                else
//                {
//                    // Position is ok
//                    //MessageBox.Show("Successfully centred the coating!");
//                    break;
//                }
//            }

//            Image<Bgr, Byte> updated_image = GetImage(My_MotiCam, 0);
//            double check_avg_val = Get_Avg_Val(updated_image, threshold);
//            if (check_avg_val < Y_pos_low_limit || check_avg_val > Y_pos_high_limit)
//            {
//                // Coating is still not centered so indicate an error and abort
//                return false;
//            }
//            else
//            {
//                //label_current_Y_action.Text = "Y Position OK";
//                //label_current_Y_action.Refresh(); 
//                return true;
//            }
//        }










////private void Capture_Sequence(Int32 num_images,  String file_name)
// //       {
// //           Int32 counter = 0;
// //           Int32 cum_y_error = 0;
// //           Int32 cum_x_error = 0;
// //           Int32 delta_X = 0, delta_Y = 0;

// //           Int32 min_delta_X = Convert.ToInt32(nud_min_delta_X.Value);
// //           Int32 X_Step = Convert.ToInt32(nud_X_motor_step_size.Value);
// //           Int32 X_Max_Steps = 9;

// //           Int32 Y_Step = Convert.ToInt32(nud_Y_motor_step_size.Value);

// //           Int32 Y_Pos_high_limit = Convert.ToInt32(nud_Y_pos_high_limit.Value);
// //           Int32 Y_Pos_low_limit = Convert.ToInt32(nud_Y_pos_low_limit.Value);
// //           double Metal_Resin_threshold = Convert.ToDouble(nud_hist_threshold.Value);

// //           Image<Bgr, Byte> img_1;
// //           Image<Bgr, Byte> img_2; 
           

// //           for (int j = 0; j < num_images; j++)
// //           {
// //               // Update the UI to show current action
// //               label_current_image.Text = "Capturing image " + (j+1).ToString() + " of " + num_images.ToString();
// //               label_current_image.Refresh();

// //               // Take a picture
// //               System.Threading.Thread.Sleep(2000);
// //               img_1 = GetImage(My_MotiCam, 0);
// //               imageBox2.Image = img_1;
// //               imageBox2.Refresh();
// //               img_1.Save(file_name + "\\img_" + String.Format("{0:000}", (j + Convert.ToInt32(nud_file_start_index.Value))) + ".tiff");

// //               // Move in the X direction
// //               while (Math.Abs(delta_X) < Math.Abs(min_delta_X))
// //               {
// //                   if (counter > X_Max_Steps)
// //                   {
// //                       MessageBox.Show("Tried to move 10 times in X direction can could not find shift. Aborting...");
// //                       return;
// //                   }

// //                   // Move in X direction a certain amount
// //                   label_current_X_action.Text = "Moving in X direction attempt " + counter.ToString() + " of " + X_Max_Steps.ToString();
// //                   label_current_X_action.Refresh();
// //                   My_Stepper.MoveX(X_Step);
// //                   System.Threading.Thread.Sleep(2000);

// //                   // Take a new picture
// //                   img_2 = GetImage(My_MotiCam, 0);
// //                   imageBox1.Image = img_2;
// //                   imageBox1.Refresh();

// //                   // Obtain position correlation
// //                   Phase.Calc_Phase_Correlation(img_1.Convert<Gray, float>(), img_2.Convert<Gray, float>(), ref delta_X, ref delta_Y);
// //                   label_phase_corr.Text = "Delta_X: " + delta_X.ToString() + " Delta_Y: " + delta_Y.ToString() + " Cumulative_X: " + cum_x_error.ToString() + " Cumulative_Y: " + cum_y_error.ToString();
// //                   label_phase_corr.Refresh();
// //                   counter++;
// //               }

// //               delta_X = 0;
// //               delta_Y = 0;
// //               counter = 0;
// //               if (!(Adjust_Y_Position(Metal_Resin_threshold, Y_Pos_high_limit, Y_Pos_low_limit, Y_Step, 15)))
// //               {
// //                   MessageBox.Show("Tried to adjust Y position 15 times but could not center coating. Aborting...");
// //                   return;
// //               }

// //               // Every fifth step or if image focus is below AFC threshold then autofocus 
// //               Image<Bgr, Byte> current_image = new Image<Bgr, Byte>(imageBox1.Image.Bitmap);
// //               Double variance = 0;
// //               Calculate_Variance(current_image, Convert.ToDouble(nud_Thresh.Value), Convert.ToDouble(nud_ThreshLinking.Value), ref variance);
// //               label_current_variance.Text = "Variance of current image: " + variance.ToString();
// //               label_current_variance.Refresh();
// //               if (((j % 5) == 0) || (variance < Convert.ToDouble(nud_afc_threshold.Value))) 
// //               {
// //                   if (!Autofocus())
// //                   {
// //                       MessageBox.Show("Unable to autofocus. Aborting...");
// //                       return;
// //                   }
// //               }

// //           }
// //           MessageBox.Show("Finished capturing image sequence.");
                
// //       }   
















// private Boolean Autofocus()
//        { 
//            Int32 stops = Convert.ToInt32(nud_afc_Stops.Value); 
//            Int32 step = Convert.ToInt32(nud_afc_StepSz.Value);
//            Image<Bgr, Byte>[] img_array = new Image<Bgr,byte>[stops];

//            Double[] std_dev_array = new Double[stops];
//            double thresh, threshLinking;
//            thresh =  Convert.ToDouble(nud_Thresh.Value);
//            threshLinking = Convert.ToDouble(nud_ThreshLinking.Value);
//            textBox_Variances.Clear();

//            // Get series of images and find the variance of the canny image for each
//            My_Stepper.MoveZ((step * stops * -1) / 2);

//            System.Threading.Thread.Sleep(1500);
//            for (int i = 0; i < stops; i++)
//            {
//                img_array[i] = GetImage(My_MotiCam, 0);
//                imageBox1.Image = img_array[i];
//                imageBox1.Refresh();
//                //img_array[i].Save("C:\\Users\\Ming\\Pictures\\Micrographs\\MechStage\\AFC\\AFC_Test_" + String.Format("{0:000}", i) + ".tiff");

//                //imageBox2.Image = Calculate_Variance(img_array[i], thresh, threshLinking, ref std_dev_array[i]);
//                imageBox2.Image = Calculate_Focus(img_array[i], ref std_dev_array[i]);
//                imageBox2.Refresh();
//                //textBox_Variances.Text += "Variance of image " + i.ToString() + ": " + String.Format("{0:00.0000}", std_dev_array[i]) + "\r\n";
//                textBox_Variances.Text += "Variance of image " + i.ToString() + ": " + std_dev_array[i].ToString() + "\r\n";
//                textBox_Variances.Refresh();

//                // If focus has got worse two steps in a row
//                if (i > 1)
//                {
//                    if ((std_dev_array[i] < std_dev_array[i - 1]) && (std_dev_array[i - 1] < std_dev_array[i - 2]))
//                    {
//                        My_Stepper.MoveZ(-2 * step);
//                        // Take the in focus picture
//                        System.Threading.Thread.Sleep(1500);
//                        img_array[0] = GetImage(My_MotiCam, 0);
//                        imageBox1.Image = img_array[0];
//                        return true;
//                    }
//                }

//                // Wait for camera to acquire a new buffer and move to new position
//                My_Stepper.MoveZ(step);
//                System.Threading.Thread.Sleep(1500);
//            }
//            return false;
//        }














  //System.Threading.Thread.Sleep(2000);
  //              img_2 = GetImage(My_MotiCam, 0);
  //              while (Try_To_Centre(img_2, Y_pos_high_limit, Y_pos_low_limit, Y_Step))
  //              {
  //                  if (counter > 15)
  //                  {
  //                      MessageBox.Show("Unable to centre coating in Y direction! Aborting...");
  //                      return;
  //                  }
  //                  else
  //                  {
  //                      System.Threading.Thread.Sleep(2000);
  //                      img_2 = GetImage(My_MotiCam, 0);
  //                      e.img_2 = img_2;
  //                      e.current_action = "Moving in the Y direction attempt " + counter.ToString() + "/15.";
  //                      ShowProgress(sender, e);
  //                      if (e.cancel) return;
  //                      counter++;
  //                  }
  //              }
  //              e.current_action = "Y position OK...";
  //              ShowProgress(sender, e);
                









        //private Boolean Try_To_Centre(Image<Bgr, Byte> current_image, Int32 Y_pos_high_limit, Int32 Y_pos_low_limit, Int32 Y_Step)
        //{
        //    // This function returns true if it tried to centre the coating, false if it didn't have to
        //    Int32 interface_position = Find_Interface(current_image);
        //    Y_pos_high_limit = Y_pos_high_limit * current_image.Size.Height / 100;
        //    Y_pos_low_limit = Y_pos_low_limit * current_image.Size.Height / 100;

        //    if (interface_position < Y_pos_high_limit)
        //    {
        //        My_Stepper.MoveY(-Y_Step);
        //        return true;
        //    }
        //    else if (interface_position > Y_pos_low_limit)
        //    {
        //        My_Stepper.MoveY(Y_Step);
        //        return true;
        //    }
        //    else
        //    {
        //        // Position is ok
        //        return false;
        //    }
        //}